css: Fix * selector to also match regions
authorBenjamin Otte <otte@redhat.com>
Wed, 7 Mar 2012 02:47:19 +0000 (03:47 +0100)
committerBenjamin Otte <otte@redhat.com>
Wed, 7 Mar 2012 02:47:19 +0000 (03:47 +0100)
Fixes css-match-region-matches-star.ui reftest.

gtk/gtkcssselector.c

index b15bb771990f35ee95f50e0e443e49489e9c68e6..af68083762801b7aaf9f7cac27dd93d10fcd4a8e 100644 (file)
@@ -71,32 +71,6 @@ gtk_css_selector_previous (const GtkCssSelector *selector)
   return selector->class ? selector : NULL;
 }
 
-/* ANY */
-
-static void
-gtk_css_selector_any_print (const GtkCssSelector *selector,
-                            GString              *string)
-{
-  g_string_append_c (string, '*');
-}
-
-static gboolean
-gtk_css_selector_any_match (const GtkCssSelector *selector,
-                            GtkStateFlags         state,
-                            const GtkWidgetPath  *path,
-                            guint                 id,
-                            guint                 sibling)
-{
-  return gtk_css_selector_match (gtk_css_selector_previous (selector), state, path, id, sibling);
-}
-
-static const GtkCssSelectorClass GTK_CSS_SELECTOR_ANY = {
-  "any",
-  gtk_css_selector_any_print,
-  gtk_css_selector_any_match,
-  FALSE, FALSE, FALSE
-};
-
 /* DESCENDANT */
 
 static void
@@ -235,6 +209,44 @@ static const GtkCssSelectorClass GTK_CSS_SELECTOR_ADJACENT = {
   FALSE, FALSE, FALSE
 };
 
+/* ANY */
+
+static void
+gtk_css_selector_any_print (const GtkCssSelector *selector,
+                            GString              *string)
+{
+  g_string_append_c (string, '*');
+}
+
+static gboolean
+gtk_css_selector_any_match (const GtkCssSelector *selector,
+                            GtkStateFlags         state,
+                            const GtkWidgetPath  *path,
+                            guint                 id,
+                            guint                 sibling)
+{
+  const GtkCssSelector *previous = gtk_css_selector_previous (selector);
+  GSList *regions;
+  
+  if (previous &&
+      previous->class == &GTK_CSS_SELECTOR_DESCENDANT &&
+      (regions = gtk_widget_path_iter_list_regions (path, id)) != NULL)
+    {
+      g_slist_free (regions);
+      if (gtk_css_selector_match (gtk_css_selector_previous (previous), state, path, id, sibling))
+        return TRUE;
+    }
+  
+  return gtk_css_selector_match (previous, state, path, id, sibling);
+}
+
+static const GtkCssSelectorClass GTK_CSS_SELECTOR_ANY = {
+  "any",
+  gtk_css_selector_any_print,
+  gtk_css_selector_any_match,
+  FALSE, FALSE, FALSE
+};
+
 /* NAME */
 
 static void